<template>
<div>
      <!-- 头部导航栏 -->
      <navbar title="登陆/注册" icon="cross" />
  
      <!-- 登陆表单区域 -->
      <van-form>
        <van-field
          v-model="user.mobile"
          left-icon="manager"
          name="用户名"
          placeholder="用户名"
          :rules="[{ required: true, message: '请填写用户名' }]"
        />

        <van-field
          v-model="user.code"
          type="password"
          left-icon="lock"
          name="密码"
          placeholder="密码"
          :rules="[{ required: true, message: '请填写密码' }]"
        >
        <template #button>
          <van-button size="small" disabled v-if="isSend == true">
            <van-count-down
              :time="1000 * 10"
              format="sss"
              @finish="isSend = false"
            ></van-count-down>
          </van-button>
          <van-button size="small" type="primary" v-else @click="sendCode"
            >发送验证码</van-button
          >
        </template>
        
        </van-field>
         
        <!-- 登录绑定的事件 -->
        <div style="margin: 16px">
          <van-button block type="info" @click="goose"
            >登陆</van-button>
        </div>

      </van-form>
      <!-- 登陆表单区域 -->
</div>
</template>

<script>
export default {
 // 组件名称
 name: 'demo',
 // 组件参数 接收来自父组件的数据
 props: [],
 // 局部注册的组件
 components: {},
 // 组件状态值
 data () {
 return {
     user:{
         mobile:"",
         code:"",
     },
     isSend:false //没有发送
 }
 },
 // 计算属性
 computed: {},
 // 侦听器
 watch: {},
 // 组件方法
 methods: {
      goose(){
            //手机号的正则
        var phone_pertten =/^1[34578]\d{9}$/;
        var code_pertten=/^\d{6}$/;
     //判断手机号是否正确
     if(this.user.monbile == "" || this.user.code == ""){
         this.$toast.fail("手机号或验证码不能为空");
         return false;
     }
     // 手机格式效验失败
     if(!phone_perrten.test(this.user.monbile)){
         this.$toast.fail("手机格式不正确");
         return false;
     }
     //验证码错误
     if(!code_pertten.test(this.user.code)){
         this.$toast.fail("验证码格式不正确");
        return false;
     }

         this.$axios.post('/authorizations').then(res=>{
             console.log(res);
            
             //把用户登陆的基本信息存储到vuex中
          this.$store.commit("login",res.data);

          //提示登陆成功
          this.$toast.success("登陆成功");
          //跳转到首页
          let url = this.$route.query.redirect || "/me";
          this.$router.replace(url);

         }).catch(error=>{
             console.log(error.response.data.message);
             this.$toast.fail('请求登陆接口的信息失败');
         })
      },
      
      sendCode(){
            //手机号的正则
      var phone_pertten = /^1[34578]\d{9}$/;
      //判断手机号或者验证码是否为空
      if (this.user.mobile == "") {
        this.$toast.fail("手机号或者验证码不能为空");
        return false;
      }
      //手机格式校验失败的时候
      if (!phone_pertten.test(this.user.mobile)) {
        this.$toast.fail("手机格式不正确");
        return false;
      }
      //修改发送状态
      this.isSend = true;
      //请求发送验证码的接口信息
      this.$axios
        .get("/sms/codes/" + this.user.mobile)
        .then((res) => {
          console.log(res);
          this.$toast.success("发送验证码成功")
        })
        .catch((error) => {
          console.log(error.response.data.message);
          this.$toast.fail("请求登陆接口的信息失败");
        });
    },     
},

 // 以下是生命周期钩子 注：没用到的钩子请自行删除
 /**
 * 在实例初始化之后，组件属性计算之前，如data属性等
 */
 beforeCreate () {
 },
 /**
 * 组件实例创建完成，属性已绑定，但DOM还未生成，$ el属性还不存在
 */
 created () {
 },
 /**
 * 在挂载开始之前被调用：相关的 render 函数首次被调用。
 */
 beforeMount () {
 },
 /**
 * el 被新创建的 vm.$ el 替换，并挂载到实例上去之后调用该钩子。
 * 如果 root 实例挂载了一个文档内元素，当 mounted 被调用时 vm.$ el 也在文档内。
 */
 mounted () {
 },
 /**
 * 数据更新时调用，发生在虚拟 DOM 重新渲染和打补丁之前。
 * 你可以在这个钩子中进一步地更改状态，这不会触发附加的重渲染过程。
 */
 beforeUpdate () {
 },
 /**
 * 由于数据更改导致的虚拟 DOM 重新渲染和打补丁，在这之后会调用该钩子。
 * 当这个钩子被调用时，组件 DOM 已经更新，所以你现在可以执行依赖于 DOM 的操作。
 */
 updated () {
 },
 /**
 * keep-alive 组件激活时调用。 仅针对keep-alive 组件有效
 */
 activated () {
 },
 /**
 * keep-alive 组件停用时调用。 仅针对keep-alive 组件有效
 */
 deactivated () {
 },
 /**
 * 实例销毁之前调用。在这一步，实例仍然完全可用。
 */
 beforeDestroy () {
 },
 /**
 * Vue 实例销毁后调用。调用后，Vue 实例指示的所有东西都会解绑定，
 * 所有的事件监听器会被移除，所有的子实例也会被销毁。
 */
 destroyed () {
 }
}
</script> 

<!-- Add "scoped" attribute to limit CSS to this component only -->
<!--使用了scoped属性之后，父组件的style样式将不会渗透到子组件中，-->
<!--然而子组件的根节点元素会同时被设置了scoped的父css样式和设置了scoped的子css样式影响，-->
<!--这么设计的目的是父组件可以对子组件根元素进行布局。-->
<style lang='scss' scoped>
</style>
